對我而言,測試就是撰寫測試程式,來執行你寫好的程式碼,並比對執行結果是否與預期相符。只要結果符合預期,就是一個成功的測試。
當專案剛開始開發時,如果養成撰寫測試的習慣,能夠大幅提升程式碼的可維護性。隨著專案擴大、不同開發者加入,測試可以幫助團隊快速掌握每個功能是否仍然正常,確保系統的穩定性。
專案就像人類,測試就像健康檢查。
如果能夠及早發現問題,就可以在疾病擴大前進行治療,避免未來積累過多的技術債。
在現代開發流程中,CI/CD(持續整合與持續部署)幾乎是團隊必備的流程之一。將自動化測試整合進 CI 流程,可以在程式碼進入測試或正式環境前,自動檢查錯誤,有效提升開發效率與信心。
Laravel 內建了完整的測試框架(基於 PHPUnit),讓我們能夠輕鬆撰寫測試。
先使用 Artisan 指令建立一支測試:php artisan make:test DemoTest
接著會在 tests/Feature
目錄下產生一個測試檔案 DemoTest.php
,預設內容如下:
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;
class DemoTest extends TestCase
{
/**
* A basic feature test example.
*/
public function testExample()
{
$response = $this->get('/');
$response->assertStatus(200);
}
}
這段程式碼會發送一個 GET 請求到首頁 /,並斷言(assert)回應的 HTTP 狀態碼為 200。如果成功,代表這條路由回應正常。
php artisan test
這個指令會執行 tests/ 資料夾中的所有測試。
php artisan test
?Laravel 自 v7 開始,預設提供了 php artisan test
指令,作為執行測試的主要入口。這個指令其實是對 phpunit 的包裝,並提供了更美觀的輸出與更好的 Laravel 整合體驗。
你也可以直接使用:
vendor/bin/phpunit
兩者功能基本一致,只是 php artisan test
更適合 Laravel 專案使用,特別是在開發階段。
Feature Test 是測試整體流程的方式,常見的作法是:
public function test_user_can_login()
{
$response = $this->post('/login', [
'email' => 'test@example.com',
'password' => 'password',
]);
$response->assertStatus(200);
}
Unit Test 著重在單一方法或類別的邏輯正確性,通常不經過路由與 HTTP 請求,而是直接呼叫方法、注入參數並斷言結果。
範例:
public function test_sum_function_returns_correct_result()
{
$service = new MathService();
$result = $service->sum(2, 3);
$this->assertEquals(5, $result);
}
項目Feature TestUnit Test測試範圍API/流程級別函式/類別級別執行方式模擬使用者操作、送出 HTTP 請求直接呼叫方法效能較慢(涉及資料庫、HTTP)較快(純邏輯)使用目的驗證整體功能是否正確驗證邏輯是否正確
這是開發圈長期的爭論議題。理論上 100% 覆蓋率可以讓你更有信心系統沒問題,但現實是:
時間有限,開發優先
不見得每個程式都值得測試(例如:簡單轉換器、極少變動邏輯)
因此,測試應該以風險導向為原則,優先針對關鍵邏輯、易變功能進行測試。
Laravel 提供完整的測試支援,從 Unit Test 到 Feature Test,搭配 php artisan test 就能快速開發與驗證功能。
測試不只是為了讓 CI/CD 順利,更是為了團隊開發能更穩健地前進。